<?php
use frontend\modules\yii2\widgets\layouts\markdown\Markdown;
use frontend\modules\yii2\widgets\layouts\example\Example;
use yii\bootstrap\Button;
use yii\bootstrap\Alert;

$this->title = '制作适合自己的Docker镜像运行Yii框架';
$this->registerMetaTag([
    'name' => 'keywords',
    'content' => 'yii,git,docker,Yii2,install,容器,镜像，框架,安装,教程,自定义'
]);
$this->registerMetaTag([
    'name' => 'description',
    'content' => '介绍基于PHP官方推出的最小容器镜像安装Yii框架'
]);
$this->registerMetaTag([
    'name' => 'author',
    'content' => 'chenzhiwei'
]);

$html = [
    "markdown0" => <<<M0
# 基于PHP官方推出的Docker镜像安装Yii框架
既然`Yiisoft`已经推出了适合yii运行的框架，那为什么还需要这么麻烦自己设计镜像呢？主要有如下几点的考虑：
- `Yiisoft`发布的镜像里的软件并不是我们想要的，而我们想要的软件又没有装，如：nginx；
- `Yiisoft`发布的镜像列表中没有我们想要的php版本；
- `Yiisoft`发布的镜像的说明文档没有php官方发布的全面；

## PHP官方镜像
PHP在Docker平台中是非常活跃的用户，因此你可以找到任意一个PHP已发布版本对应的镜像，[点我前往](https://hub.docker.com/_/php)：
![PHP在Docker中的搜索结果](/images/20211116174121.png)

> 重点在于PHP官方发布的镜像都是最小化安装的，镜像大概400M左右，我们可以编写`Dockerfile`文件自定义镜像。

## Dockerfile
下载`Dockerfile`文件及其依赖的文件：
```shell
git clone -b 8.0.7.1 https://gitee.com/lv_dockerfile/php-fpm.git Dockerfile
```

下面是目前我正在用的`Dockerfile`文件：
```shell
#docker build --no-cache -t php-fpm:8.0.7.1 .

FROM php:8.0.7-fpm
MAINTAINER chenzhiwei "chenzhiweiwk@qq.com"

# set timezone
ENV TZ=Asia/Shanghai

# set timezone
RUN ln -snf /usr/share/zoneinfo/\$TZ /etc/localtime && echo \$TZ > /etc/timezone \
    #php config
    && mv "\$PHP_INI_DIR/php.ini-development" "\$PHP_INI_DIR/php.ini" \
    #update the php-ext
    && apt-get update && apt-get install -y \
       libfreetype6-dev \
       libjpeg62-turbo-dev \
       libpng-dev \
       libzip-dev \
       libcurl4-openssl-dev \
       vim \
       git \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install zip \
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-install opcache \
    && docker-php-ext-install mysqli \
    && docker-php-ext-install curl \
    #install nginx
    && apt-get update && apt-get install -y procps wget libpcre3-dev zlib1g-dev openssl libssl-dev \
    && cd /tmp \
    && wget http://nginx.org/download/nginx-1.20.1.tar.gz \
    && tar -zxf nginx-1.20.1.tar.gz \
    && cd nginx-1.20.1 \
    && mkdir -p /var/tmp/nginx/client/ \
    && mkdir -p /var/tmp/nginx/proxy/ \
    && mkdir -p /var/tmp/nginx/fcgi/ \
    && mkdir -p /var/tmp/nginx/scgi/ \
    && mkdir -p /var/tmp/nginx/scgi/ \
    && useradd -s /sbin/nologin -M nginx \
    && ./configure \
         --prefix=/usr/local/ \
         --sbin-path=/usr/sbin/ \
         --conf-path=/usr/local/nginx/nginx.conf \
         --error-log-path=/usr/local/nginx/log/error.log \
         --http-log-path=/usr/local/nginx/log/access.log \
         --pid-path=/var/run/nginx/nginx.pid  \
         --lock-path=/var/lock/nginx.lock \
         --user=nginx \
         --group=nginx \
         --with-http_ssl_module \
         --with-http_flv_module \
         --with-http_stub_status_module \
         --with-http_gzip_static_module \
         --http-client-body-temp-path=/var/tmp/nginx/client/ \
         --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
         --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
         --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
         --http-scgi-temp-path=/var/tmp/nginx/scgi \
         --with-pcre \
    && make install \
    && rm /tmp/nginx-1.20.1.tar.gz \
    && rm -rf /tmp/nginx-1.20.1 \ 
    && mkdir /usr/local/nginx/vhosts \ 
    && mkdir /usr/local/nginx/certs 

COPY nginx.conf /usr/local/nginx/nginx.conf
COPY yii.conf /usr/local/nginx/vhosts/yii.conf
COPY startup.sh /srv/startup.sh


# clear the apt list
RUN rm -r /var/lib/apt/lists/* \
  && chmod 777 /srv/startup.sh \
  && cd /var/www/html \
  && git clone -b 2.0.43.1.1 https://gitee.com/lv_frame/yii.git yii \
  && chown www-data:www-data -R yii 

WORKDIR /var/www/html

# start php-fpm and nginx
ENTRYPOINT ["/bin/bash", "-C", "/srv/startup.sh"]
```

## 构建镜像
大家注意`Dockerfile`文件中的第一行注释就是构建镜像的命令：
```
cd Dockerfile;
docker build --no-cache -t php-fpm:8.0.7.1 .
```
我已经构建了一份镜像发布到了[lvzmen/php-fpm](https://hub.docker.com/r/lvzmen/php-fpm)中，并写了较为全面的使用文档：
```shell
sudo docker run -itd --name php8 -p 80:80 lvzmen/php-fpm:8.0.7.1
```


## 运行自定义容器
通过如下命令去运行我们自定义的容器：
```
docker run -itd --name yii2 -p 80:80 php-fpm:8.0.7.1
```
由于容器的`80`端口映射到了宿主机中的`80`端口，因此直接访问虚拟机的IP就可以访问到YII：
![运行于自定义容器镜像中的YII前台](/images/20211116180458.png)
M0,
];

foreach($html as $name => $item){
    switch ($name) {
        case strpos($name, "example") !== false:
            echo Example::widget($item);
            break;
        case strpos($name, "markdown") !== false:
            echo Markdown::widget(["content" => $item]);
            break;
        default:
            break;
    }
}